package com.sokobanboxpro.game.gameplay;

import com.sokobanboxpro.game.exception.ConfigValueNotFoundException;
import com.sokobanboxpro.game.managers.LevelManager;
import com.sokobanboxpro.game.system.Config;
import java.io.*;
import java.util.logging.Logger;
import org.newdawn.slick.Image;
import org.newdawn.slick.SlickException;

/**
 * Игра.
 * Игра - одно из состояний приложения, содержит в себе геймплей и интерфейс
 * Определяет, какой сечас уровень играется
 * @author Esr
 */

public class Game {

		/**
		 * Текущий уровень
		 */
		private Level currentLevel;
		/**
		 * Геймплей игры
		 */
		private Gameplay gameplay;
		/**
		 * Интерфейс игры
		 */
		private Interface inter;

		public Game() {
		}

		/**
		 * Инициализация игры.
		 * Загружаються уровни. Создается геймплей и интерфейс
		 * @throws SlickException
		 * @throws IOException Файл уровней не может быть открыт
		 * @throws ConfigValueNotFoundException Не найден путь до уровней
		 * @throws Exception 
		 */
		public void init() throws SlickException, IOException, ConfigValueNotFoundException, Exception {


				LevelManager.loadLevelFromFile(Config.toStr("LevelPath"));

				setCurrentLevel(LevelManager.getLevel(0));

				gameplay = new Gameplay();
				inter = new Interface();

				gameplay.init(this);
				inter.init(this);

		}

		/**
		 * Получить текущий уровень
		 * @return Текущий уровень
		 */
		public Level getCurrentLevel() {
				return currentLevel;
		}

		/**
		 * Сменить уровень
		 * @param num Номер уровня
		 */
		public void changeLevel(int num) {
				setCurrentLevel(LevelManager.getLevel(num));
		}
		
		/**
		 * Заменить уровень
		 * @param level Уровень, который будет установлен
		 */

		private void setCurrentLevel(Level level) {
				this.currentLevel = level;
		}

		/**
		 * Получить геймплей
		 * @return Геймплей
		 */
		public Gameplay getGameplay() {
				return gameplay;
		}

		/**
		 * Получить интерфейс
		 * @return Интерфейс
		 */
		public Interface getInterface() {
				return inter;
		}
}
